/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package treegen;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.event.EventType;
import javafx.geometry.Insets;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontPosture;
import javafx.scene.text.Text;
import javafx.util.Callback;

/**
 *
 * @author Елена
 */
public class BranchLevel {
    VBox mainPane;
    NumberSpinner length;
    NumberSpinner width;
    NumberSpinner rad;
    NumberSpinner height;
    NumberSpinner angle;
    NumberSpinner childCount;
    NumberSpinner childRep;
    NumberSpinner heightL;
    ComboBox combo;
    int number;
    Tree tree;
    
    BranchLevel (int number, Tree tree) {
        final TreeGen t = tree.window;
        this.number = number;
        this.tree = tree;
        mainPane = new VBox();
        // Виджет для длины
        HBox lBox = new HBox();
        Text textL = new Text("Длина ветви:");
        textL.setFont(Font.font("Verdana", FontPosture.ITALIC, 14));
        length = new NumberSpinner(BigDecimal.valueOf(0.00), new BigDecimal("1.00"), new DecimalFormat("#,##0.00"),(float)0.00, (float)1000000.0);
        lBox.getChildren().addAll(textL, length);
        lBox.setPadding(new Insets(0, 0, 10, 0));
        
        // Виджет для ширины
        HBox wBox = new HBox();
        Text textW = new Text("Ширина ветви:");
        textW.setFont(Font.font("Verdana", FontPosture.ITALIC, 14));
        width = new NumberSpinner(BigDecimal.valueOf(0.00), new BigDecimal("1.00"), new DecimalFormat("#,##0.00"),(float)0.00, (float)1000000.0);
        wBox.getChildren().addAll(textW, width);
        wBox.setPadding(new Insets(0, 0, 10, 0));
        
        // Виджет для расстояния
        HBox rBox = new HBox();
        Text textR = new Text("Расстояние между ветками по стволу:");
        textR.setFont(Font.font("Verdana", FontPosture.ITALIC, 14));
        rad = new NumberSpinner(BigDecimal.valueOf(0.00), new BigDecimal("1.00"), new DecimalFormat("#,##0.00"),(float)0.00, (float)1000000.0);
        rBox.getChildren().addAll(textR, rad);
        rBox.setPadding(new Insets(0, 0, 10, 0));
        
        // Виджет для расстояния
        HBox hBox = new HBox();
        Text textH = new Text("Высота между ветками по стволу:");
        textH.setFont(Font.font("Verdana", FontPosture.ITALIC, 14));
        height = new NumberSpinner(BigDecimal.valueOf(0.00), new BigDecimal("1.00"), new DecimalFormat("#,##0.00"),(float)0.00, (float)1000000.0);
        hBox.getChildren().addAll(textH, height);
        hBox.setPadding(new Insets(0, 0, 10, 0));
        
        // Виджет для угла
        HBox aBox = new HBox();
        Text textA = new Text("Угол к стволу:");
        textA.setFont(Font.font("Verdana", FontPosture.ITALIC, 14));
        angle = new NumberSpinner((float)0, (float)180);
        aBox.getChildren().addAll(textA, angle);
        aBox.setPadding(new Insets(0, 0, 10, 0));
        
        // Виджет для кол-ва дочерних ветвей
        HBox cBox = new HBox();
        Text textC = new Text("Количество дочерних ветвей:");
        textC.setFont(Font.font("Verdana", FontPosture.ITALIC, 14));
        childCount = new NumberSpinner((float)0, (float)10);
        cBox.getChildren().addAll(textC, childCount);
        cBox.setPadding(new Insets(0, 0, 10, 0));
        
        // Виджет для кол-ва  повторений дочерних ветвей
        HBox cRBox = new HBox();
        Text textCR = new Text("Количество повторений дочерних ветвей:");
        textCR.setFont(Font.font("Verdana", FontPosture.ITALIC, 14));
        childRep = new NumberSpinner((float)0, (float)5);
        cRBox.getChildren().addAll(textCR, childRep);
        cRBox.setPadding(new Insets(0, 0, 10, 0));
        
        // Виджет для высоты уровня
        HBox hLBox = new HBox();
        Text textHL = new Text("Высота уровня:");
        textHL.setFont(Font.font("Verdana", FontPosture.ITALIC, 14));
        heightL = new NumberSpinner(BigDecimal.valueOf(0.00), new BigDecimal("1.00"), new DecimalFormat("#,##0.00"),(float)0.00, (float)1000000.0);
        hLBox.getChildren().addAll(textHL, heightL);
        hLBox.setPadding(new Insets(0, 0, 10, 0));
        
        HBox right = new HBox();
        Text r = new Text("Прямой");
        r.setFont(Font.font("Verdana", 12));
        ImageView rig = new ImageView(new Image(BranchLevel.class.getResourceAsStream("pictures/right.jpg")));
        right.getChildren().addAll(rig, r);
        
        combo = new ComboBox();
        combo.getItems().addAll(
            "Прямой",
            "Изогнутый вверх",
            "Изогнутый вниз"
        );   
        
        HBox comboB = new HBox();
        Text com = new Text("Тип:");
        com.setFont(Font.font("Verdana", FontPosture.ITALIC, 14));
        
        comboB.setPadding(new Insets(0, 0, 10, 0));
        Callback<ListView<String>, ListCell<String>> factory = new Callback<ListView<String>, ListCell<String>>() {
        @Override
        public ListCell<String> call(ListView<String> list) {
            return new ImageCell();
        }
        };
        combo.setCellFactory(factory);
        combo.setButtonCell(factory.call(null));
        comboB.getChildren().addAll(com, combo);
        combo.setValue(right);
        combo.setOnAction(new EventHandler() {

            @Override
            public void handle(Event event) {
                t.getValues();
            }
        });
        mainPane.getChildren().addAll(lBox, wBox, rBox, hBox, aBox, cBox, cRBox, hLBox, comboB);
        mainPane.setPadding(new Insets(5, 0, 5, 10));
        length.numberField.addSpinnerValueChangedListener(tree.window);
        width.numberField.addSpinnerValueChangedListener(tree.window);
        rad.numberField.addSpinnerValueChangedListener(tree.window);
        height.numberField.addSpinnerValueChangedListener(tree.window);
        angle.numberField.addSpinnerValueChangedListener(tree.window);
        childCount.numberField.addSpinnerValueChangedListener(tree.window);
        childRep.numberField.addSpinnerValueChangedListener(tree.window);
        heightL.numberField.addSpinnerValueChangedListener(tree.window);
    }

    public void getValues() {
        double width;
        double length;
        double rad;
        double angle;
        double levHeight;
        Branch curBranch = tree.branches.get(number);
        // Проверка от ствола!!! TODO
        length = this.length.getNumber().doubleValue();
        curBranch.length = length;
        width = this.width.getNumber().doubleValue();
        if (width > 0.2*length || width < 0.05*length){
            
        } else {
            curBranch.width = width;
        }
        
        // Проверка от ствола!!! TODO
        rad = this.rad.getNumber().doubleValue();
        curBranch.radByTrunk = rad;
        curBranch.heightByTrunk = height.getNumber().doubleValue();
        angle = this.angle.getNumber().doubleValue();
        if (angle <= 0 || angle >= 180) {
            
        } else {
            curBranch.angle = angle;
        }
        
        curBranch.childrenCount = childCount.getNumber().intValue();
        curBranch.repetCount = childRep.getNumber().intValue();
        
        levHeight = heightL.getNumber().doubleValue();
        // Проверка от ствола!!! TODO
        curBranch.height = levHeight;
        int type = combo.getButtonCell().getIndex();
        if (type == 0) {
            curBranch.type = BranchType.Right;
        } else if (type == 1) {
            curBranch.type = BranchType.Up;
        } else {
            curBranch.type = BranchType.Down;
        }
    }
    
    static class ImageCell extends ListCell<String> {

        @Override
        public void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);
            if (item != null) {
                if (item.contains("Прямой")) {
                    HBox right = new HBox();
                    Text r = new Text("Прямой");
                    r.setFont(Font.font("Verdana", 12));
                    ImageView rig = new ImageView(new Image(BranchLevel.class.getResourceAsStream("pictures/right.jpg")));
                    right.getChildren().addAll(rig, r);
                    setGraphic(right);
                } else if (item.contains("Изогнутый вниз")) {
                    HBox down = new HBox();
                    Text d = new Text("Изогнутый вниз");
                    d.setFont(Font.font("Verdana", 12));
                    ImageView dow = new ImageView(new Image(BranchLevel.class.getResourceAsStream("pictures/down.jpg")));
                    down.getChildren().addAll(dow, d);
                    setGraphic(down);
                } else {
                    HBox up = new HBox();
                    Text u = new Text("Изогнутый вверх");
                    u.setFont(Font.font("Verdana", 12));
                    ImageView upp = new ImageView(new Image(BranchLevel.class.getResourceAsStream("pictures/up.jpg")));
                    up.getChildren().addAll(upp, u);
                    setGraphic(up);
                }
            }
        }
    }
}
   